AWS CDK で cdk rollback コマンドが利用可能になりました
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS CDK の最近のリリースである v2.162.0 で、下記のアップデートが追加されていました。
cli: cdk rollback (#31684) (3e40edc), closes #31407
端的に言うと cdk rollback
コマンドが利用可能になったというものです。AWS CDK のドキュメントにもコマンドのページが追加されていました。
用途としては、デプロイ失敗時にデバッグのためにデプロイされたリソースを保持したい場合に、cdk deploy --no-rollback
コマンドによりデプロイ失敗時の自動ロールバックを停止させることが今までもできていました。この停止したロールバックを CLI で再開させることができるのが今回のコマンドになります。
試してみた
cdk rollback
次のようなデプロイが失敗するスタックを作成します。
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as iam from 'aws-cdk-lib/aws-iam';
export class SampleApp extends cdk.Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
// IAMロールを作成
const role = new iam.Role(this, 'Role', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});
// 存在しないマネージドポリシーをアタッチしてエラーを発生させる
role.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName('non-existent-managed-policy')
);
}
}
cdk deploy --no-rollback
コマンドを実行して、スタックをデプロイします。
$ cdk deploy --no-rollback --require-approval never --method=direct SampleApp
✨ Synthesis time: 4.48s
SampleApp: deploying... [1/1]
SampleApp: updating stack...
9:35:01 PM | CREATE_FAILED | AWS::IAM::Role | Role1ABCC5F0
Resource handler returned message: "Policy arn:aws:iam::aws:policy/non-existent-managed-policy does not exist or is not attachable. (Service: Iam, Status Code: 404, Request ID: fe023d8d
-d9c7-485a-8c1c-34a13095bde0)" (RequestToken: a023c9c9-96fc-1aff-298b-a0127b87d916, HandlerErrorCode: NotFound)
❌ SampleApp failed: The stack named SampleApp failed to deploy: UPDATE_FAILED (The following resource(s) failed to create: [Role1ABCC5F0]. ): Resource handler returned message: "Policy arn:aws:iam::aws:policy/non-existent-managed-policy does not exist or is not attachable. (Service: Iam, Status Code: 404, Request ID: fe023d8d-d9c7-485a-8c1c-34a13095bde0)" (RequestToken: a023c9c9-96fc-1aff-298b-a0127b87d916, HandlerErrorCode: NotFound)
すると IAM ロールは作成されますが、マネージドポリシーのアタッチは失敗した状態でロールバックが停止します。
cdk rollback
コマンドを実行して、ロールバックを実行してみます。しかし、ブートストラップリソースのバージョンが古いため、コマンド実行が失敗しました。現在は 20 ですが、23 以上である必要があります。
$ cdk rollback SampleApp
✨ Synthesis time: 7.27s
Rolling back SampleApp
❌ SampleApp failed: SampleApp: This CDK deployment requires bootstrap stack version '23', found '20'. Please run 'cdk bootstrap'.
Rollback failed (use --force to orphan failing resources)
ブートストラップリソースをバージョンアップします。
$ cdk bootstrap
⏳ Bootstrapping environment aws://XXXXXXXXXXXX/ap-northeast-1...
Trusted accounts for deployment: (none)
Trusted accounts for lookup: (none)
Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
CDKToolkit: creating CloudFormation changeset...
✅ Environment aws://XXXXXXXXXXXX/ap-northeast-1 bootstrapped.
23 にバージョンアップされました。
再度、cdk rollback
コマンドを実行します。
$ cdk rollback SampleApp
✨ Synthesis time: 5.15s
Rolling back SampleApp
✨ Rollback time: 16.51s
ロールバックできました。
同じデプロイにより作成を試みた IAM ロールもロールバックにより削除されています。
失敗するロールバックを強制的に実行したい場合
cdk rollback
によるロールバックの実行時に一部のリソースのロールバックに失敗する場合があります。その場合はオプションにより失敗するリソースを孤立させることができます。
--orphan <LogicalId>
オプションを使用すると指定したリソースのロールバックをスキップし、そのリソースを孤立させることができます。
--force
を使用すると、ロールバックが失敗するすべてのリソースを孤立させることができます。
おわりに
AWS CDK で cdk rollback コマンドが利用可能になったので試してみました。
ECS Service のサーキットブレーカーなど、ログを調査しないとデプロイ失敗の原因が分からない場合に、コンテナやロググループが自動ロールバックにより削除されてしまうことを防ぐために役立ちそうだと感じました。
参考
以上